package org.example;

/**
 * java并发编程实战 模拟CAS代码
 * CAS（Compare and Swap） 指的是现代 CPU 广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。
 * 简单介绍一下这个指令的操作过程：
 * 首先，CPU 会将内存中将要被更改的数据与期望的值做比较。
 * 然后，当这两个值相等时，CPU 才会将内存中的数值替换为新的值。否则便不做操作。
 * 最后，CPU 会将旧的数值返回。这一系列的操作是原子的。
 * 简单来说，CAS 的含义是“我认为原有的值应该是什么，如果是，则将原有的值更新为新值，否则不做修改，并告诉我原来的值是多少”
 *
 * Compare and Set
 * Compare and Set 就是利用 Compare and Swap 实现的非阻塞的线程安全的写操作算法。
 * 它的实现过程如下：首先读取你要更改的数据的原值，然后将其和你要更新成的值作为 Compare and Swap 操作的两个参数，
 * 如果 Compare and Swap 的返回值和原值不同，便重复这一过程，直至成功。
 *
 * ABA问题：
 * CAS操作容易导致ABA问题,也就是在做a++之间，a可能被多个线程修改过了，只不过回到了最初的值，这时CAS会认为a的值没有变。
 */
public class SimulatedCASDemo {
    private int value;

    public synchronized int getValue(){
        return value;
    }

    //compareAndSwap是底层（sun包或者native c++）实现，由硬件保证原子性，不论是否设置成功都返回老值,代码里通过synchronized关键字模拟硬件的原子性
    private synchronized  int compareAndSwap(int expectedValue, int newValue)
    {
        int oldValue = value;
        if(oldValue == expectedValue)
        {
            value = newValue;
        }
        return oldValue;
    }

    //compareAndSet是API
    public synchronized  boolean compareAndSet(int expectedValue, int newValue)
    {
        return(expectedValue == compareAndSwap(expectedValue, newValue));
    }
}
